﻿Imports Microsoft.Office.Interop
Imports System.IO
Imports Logica
Imports System.Text.RegularExpressions

Public Class RegistrarUsuario

    ''' <summary>
    ''' Carga los datos para el registro.
    ''' </summary>
    ''' <remarks>Creado Por: Elías Baldioceda, Fecha: 14/06/2010, Modificado: 27/06/2010</remarks>
    Private Sub RegistrarUsuario_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        cmbTipoID.SelectedIndex = 0
        txtNombre.Focus()

        Try
            ' Roles
            Dim rolesCmb As New List(Of MiComboBox)
            Dim roles As List(Of Hashtable)

            roles = Gestor.rolBuscar()

            For Each rol As Hashtable In roles
                Dim item As MiComboBox

                item = New MiComboBox(rol("descripcion"), rol("id"))
                rolesCmb.Add(item)
            Next

            cmbRol.DisplayMember = "descripcion"
            cmbRol.ValueMember = "valor"
            cmbRol.DataSource = rolesCmb
            cmbRol.SelectedValue = 3

            ' Departamento y puestos.
            Dim departamentos As List(Of Hashtable)
            Dim opciones As New List(Of MiComboBox)

            departamentos = Gestor.departamentosTodos()
            opciones.Add(New MiComboBox("Seleccione", 0))

            For Each departamento As Hashtable In departamentos
                opciones.Add(New MiComboBox(departamento("nombre"), departamento("codigo")))
            Next

            cmbDepartamento.DisplayMember = "descripcion"
            cmbDepartamento.ValueMember = "valor"
            cmbDepartamento.DataSource = opciones
        Catch ex As Exception
            lblError.ForeColor = Color.Red
            lblError.Text = "No se pudieron cargar bien los datos."
            btnRegistrar.Enabled = False
        End Try
    End Sub

    ''' <summary>
    ''' Carga el directorio de la foto.
    ''' </summary>
    ''' <remarks>Creado Por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Private Sub btnBuscarFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarFoto.Click
        Dim ofd As New OpenFileDialog
        Dim path As String

        ofd.Filter = "Imágenes (*.png, *.jpg, *.bmp, *.gif)|*.png;*.jpg;*.bmp;*.gif"
        ofd.Multiselect = False
        ofd.ShowDialog()
        path = ofd.FileName

        txtFoto.Text = path
    End Sub

    ''' <summary>
    ''' Carga el directorio del currículo.
    ''' </summary>
    ''' <remarks>Creado Por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Private Sub btnBuscarCurriculo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarCurriculo.Click
        Dim ofd As New OpenFileDialog
        Dim path As String


        ofd.Filter = "Documento de Word (*.doc, *.docx)|*.doc;*.docx"
        ofd.Multiselect = False
        ofd.ShowDialog()
        path = ofd.FileName

        txtCurriculo.Text = path
    End Sub

    ''' <summary>
    ''' Registra al usuario.
    ''' </summary>
    ''' <remarks>Creado Por: Elías Baldioceda, Fecha: 14/06/2010, Modificado: 20/06/2010</remarks>
    Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click
        Dim curriculo As String
        Dim foto As Bitmap
        Dim genero As String
        Dim regexCorreo As New Regex("^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$")
        Dim contrasenna As String

        ' Validar los controles de texto.
        For Each control As Control In gbRegistrar.Controls
            If TypeOf control Is TextBox Then
                If control.Text.Trim = "" Then
                    control.Focus()
                    lblError.ForeColor = Color.Red
                    lblError.Text = "El campo '" & control.Tag & "' está vacío."
                    Exit Sub
                End If
            End If
        Next

        ' Chequea el formato del correo.
        If Not regexCorreo.IsMatch(txtCorreo.Text) Then
            lblError.ForeColor = Color.Red
            lblError.Text = "El formato del correo ingresado no es válido."
            txtCorreo.Focus()
            Exit Sub
        End If

        ' Chequea si selecciona un departamento.
        If cmbDepartamento.SelectedValue = 0 Then
            lblError.ForeColor = Color.Red
            lblError.Text = "Seleccione un departamento."
            cmbDepartamento.Focus()
            Exit Sub
        End If

        ' Chequea si selecciona un puesto.
        If cmbPuesto.SelectedValue = 0 Then
            lblError.ForeColor = Color.Red
            lblError.Text = "Seleccione un puesto."
            cmbPuesto.Focus()
            Exit Sub
        End If

        Try
            Dim wordApp As New Word.Application
            Dim wordDoc As Word.Document

            ' Obtiene el documento del directorio seleccionado.
            wordDoc = wordApp.Documents.Open(txtCurriculo.Text)

            ' Obtiene el XML del documento.
            curriculo = wordDoc.Content.XML
            wordDoc.Close() ' Se cierra el documento para terminar el proceso.

            ' Obtiene el Bitmap del directorio seleccionado.
            foto = Bitmap.FromFile(txtFoto.Text)

            If foto.Width > 125 Or foto.Height > 125 Then
                Throw New Exception("El tamaño de la imagen no debe ser mayor a 125px de alto ni 125px de ancho.")
            End If

            If rdoMasculino.Checked Then
                genero = "Masculino"
            Else
                genero = "Femenino"
            End If

            contrasenna = Gestor.usuarioRegistrar(cmbTipoID.SelectedItem, txtNumeroID.Text, txtNombre.Text, txtPrimerApellido.Text, txtSegundoApellido.Text, genero, dtpFechaNacimiento.Value, txtCorreo.Text, txtTelefono.Text, cmbRol.SelectedValue, foto, curriculo, txtNombreUsuario.Text, cmbPuesto.SelectedValue)

            lblError.ForeColor = Color.Green
            lblError.Text = "Usuario registrado con éxito. Nombre de usuario: " & txtNombreUsuario.Text & ". Contraseña: " & contrasenna & "."
            restablecerCampos()
        Catch ex As SqlClient.SqlException
            lblError.ForeColor = Color.Red
            If ex.Number = 2627 Then
                lblError.Text = "El número de identificación ya existe."
            Else
                lblError.Text = "Error de conexión."
            End If
        Catch ex As Exception
            lblError.ForeColor = Color.Red
            lblError.Text = ex.Message
        End Try
    End Sub

    ''' <summary>
    ''' Vacía los campos al mostrar la pantalla.
    ''' </summary>
    ''' <remarks>Creado Por: Elías Baldioceda, Fecha: 23/06/2010, Modificado: 23/06/2010</remarks>
    Private Sub RegistrarUsuario_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.VisibleChanged
        If Visible = True Then
            restablecerCampos()

            ' Departamento y puestos.
            Dim departamentos As List(Of Hashtable)
            Dim opciones As New List(Of MiComboBox)

            departamentos = Gestor.departamentosTodos()
            opciones.Add(New MiComboBox("Seleccione", 0))

            For Each departamento As Hashtable In departamentos
                opciones.Add(New MiComboBox(departamento("nombre"), departamento("codigo")))
            Next

            cmbDepartamento.DisplayMember = "descripcion"
            cmbDepartamento.ValueMember = "valor"
            cmbDepartamento.DataSource = opciones

            lblError.Text = ""
        End If
    End Sub

    Private Sub restablecerCampos()
        ' Vaciar los campos de texto.
        For Each control As Control In gbRegistrar.Controls
            If TypeOf control Is TextBox Then
                control.Text = ""
            ElseIf TypeOf control Is DateTimePicker Then
                CType(control, DateTimePicker).Value = Date.Now()
            End If
        Next

        ' FIX Vista
        cmbDepartamento.SelectedIndex = 0
        cmbRol.SelectedValue = 3
        cmbPuesto.Enabled = False

        ' Pone por defecto el rol de empleado común.
        cmbRol.SelectedIndex = 2

        rdoMasculino.Checked = True
    End Sub

    ''' <summary>
    ''' Muestra los puestos del departamento seleccionado.
    ''' </summary>
    ''' <remarks>Creado Por: Elías Baldioceda, Fecha: 27/06/2010, Modificado: 27/06/2010</remarks>
    Private Sub cmbDepartamento_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbDepartamento.SelectedIndexChanged
        If cmbDepartamento.SelectedValue <> 0 Then
            Dim puestos As List(Of Hashtable)
            Dim opciones As New List(Of MiComboBox)

            puestos = Gestor.listarPuestosPorDepartamento(cmbDepartamento.SelectedValue)
            opciones.Add(New MiComboBox("Seleccione", 0))

            For Each puesto As Hashtable In puestos
                opciones.Add(New MiComboBox(puesto("nombre"), puesto("codigo")))
            Next

            cmbPuesto.Enabled = True
            cmbPuesto.DisplayMember = "descripcion"
            cmbPuesto.ValueMember = "valor"
            cmbPuesto.DataSource = opciones
        Else
            cmbPuesto.DataSource = Nothing
            cmbPuesto.Enabled = False
        End If
    End Sub


    Private Sub cmbRol_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbRol.SelectedIndexChanged
        If cmbRol.SelectedValue = 1 Then
            cmbDepartamento.SelectedValue = 1
            cmbPuesto.SelectedValue = 2
            cmbDepartamento.Enabled = False
            cmbPuesto.Enabled = False
        ElseIf cmbRol.SelectedValue = 2 Then
            cmbDepartamento.SelectedValue = 1
            cmbPuesto.SelectedValue = 1
            cmbDepartamento.Enabled = False
            cmbPuesto.Enabled = False
        Else
            cmbDepartamento.Enabled = True
            cmbPuesto.Enabled = True
        End If
    End Sub
End Class
